package com.info.zhiduoduo.pay.sdk.dayspaysdk.model.pay.request;

import com.info.zhiduoduo.pay.sdk.dayspaysdk.constant.AccountType;
import com.info.zhiduoduo.pay.sdk.dayspaysdk.constant.CurrencyType;
import com.info.zhiduoduo.pay.sdk.dayspaysdk.constant.DaysApiTypeEnum;
import com.info.zhiduoduo.pay.sdk.dayspaysdk.constant.OrderFromType;
import com.info.zhiduoduo.pay.sdk.dayspaysdk.constant.RemitDirection;
import com.info.zhiduoduo.pay.sdk.dayspaysdk.core.util.DateUtil;
import com.info.zhiduoduo.pay.sdk.dayspaysdk.core.util.LocalSeqNo;
import com.info.zhiduoduo.pay.formbean.dayspay.DaysAgentPayFormBean;

import java.math.RoundingMode;
import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class PayReqDTO {

	/** 处理码	N	6	1	1	参考5.1 */
	private String processCode;
	/** 版本号	AN	10	0	0	默认1.0.0 */
	private String version;
	/** 商户编号	N	15	1	1 */
	private String merchantNo;
	/** 商户订单编号	AN	30	1	1	付款成功不重复 */
	private String merchantOrderNo;
	/** 请求流水	AN	30	1	1	每笔请求不重复 */
	private String sequenceNo;
	/** 订单有效期	N	14	0	0	格式:yyyyMMddHHmmss */
	private String validTime;
	/** 订单来源	N	2	0	0	参考5.2 */
	private String orderFrom;
	/** 汇兑方向	N	2	1	1	参考5.9，默认01 */
	private String direction;
	/** 金额	AN	12	1	1	格式:12.34元 */
	private String amount;
	/** 币种	AN	3	1	1	参考5.3，默认156 */
	private String currency;
	/** 订单描述	ANS	250	0	0	参考5.9 */
	private String description;
	/** 收款账号	AN	19	1	1 */
	private String accountNo;
	/** 账号类型	AN	2	0	0	参考5.8 */
	private String accountType;
	/** 开户证件号	AN	20	0	0 */
	private String idcardNo;
	/** 开户证件类型	AN	2	0	0	参考5.5 */
	private String idcardType;
	/** 开户姓名	ANS	60	1	0 */
	private String name;
	/** 手机号	N	15	0	0 */
	private String mobileNo;
	/** 银行代号	AN	15	0	0	参考5.4 */
	private String bankCode;
	/** 支行名或swift代号	ANS	250	0	0	国内对公填写支行名,跨境汇出填写swift代号 */
	private String branchNo;
	/** 开户省份	ANS	100	0	0	国内对公填 */
	private String accountProvince;
	/** 开户城市	ANS	100	0	0	国内对公填 */
	private String accountCity;
	/** 跨境收款账号地址	ANS	250	0	0	跨境汇出必填 */
	private String borderAddress;
	/** 资金来源账号	AN	19	0	0	跨境汇出必填 */
	private String fromAccountNo;
	/** 资金来源账号开户名	ANS	60	0	0	跨境汇出必填 */
	private String fromAccountName;
	/** 物流信息	ANS	100	0	0	跨境汇出必填 */
	private String borderGoodsInfo;
	/** 跨境合同编号	ANS	50	0	0	跨境汇出必填 */
	private String borderContractNo;
	/** 交易数据	ANS	2000	0	0	json格式，可定制 */
	private String transInfo;
	/** 异步返回地址	AN	200	0	0	首选返回地址 */
	private String asynResUrl1;
	/** 异步返回地址	AN	200	0	0	备用返回地址 */
	private String asynResUrl2;
	/** 报文签名信息	AN	1200	1	0 */
	private String signMsg;
	/** 服务代号	N	4	1	1	0300 */
	private String serviceCode;

	public static PayReqDTO of(DaysAgentPayFormBean formBean) {
		PayReqDTO dto = new PayReqDTO().setServiceCode(DaysApiTypeEnum.AGENT_PAY.serviceCode)
				.setProcessCode(DaysApiTypeEnum.AGENT_PAY.processCode)
				.setVersion("1.0.0")
				.setMerchantOrderNo(formBean.getTradeNo())
				.setSequenceNo(DateUtil.MMdd(new Date()) + LocalSeqNo.next(8))
				.setOrderFrom(OrderFromType.BACKEND_API)
				.setDirection(RemitDirection.DOMESTIC_AGENT_PAY)
				.setAmount(formBean.getTradeamount().setScale(2, RoundingMode.FLOOR).toString())
				.setCurrency(CurrencyType.RMB)
				.setDescription(formBean.getPurpose())
				.setAccountNo(formBean.getAcctNo());

		if (formBean.getAcctType() == 1) {
			dto.setAccountType(AccountType.DOMESTIC_DEBIT);
		} else if (formBean.getAcctType() == 2) {
			dto.setAccountType(AccountType.CORPORATE);
		}
		dto.setName(formBean.getAcctName());
		return dto;
	}
}